<?php

namespace App\Http\Controllers\Api;

use App\Model\Product;
use App\Transformers\ProductTransformer;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class ProductsController extends Controller
{
    public function index(Request $request)
    {
        $builder  = Product::query()->where('on_sale',true);

        // search 参数用来模糊搜索商品
        if ($search = $request->input('search', '')) {
            $like = '%'.$search.'%';
            // 模糊搜索商品标题、商品详情、SKU 标题、SKU描述
            $builder->where(function ($query) use ($like) {
                $query->where('title', 'like', $like)
                    ->orWhere('description', 'like', $like)
                    ->orWhereHas('skus', function ($query) use ($like) {
                        $query->where('title', 'like', $like)
                            ->orWhere('description', 'like', $like);
                    });
            });
        }

        // 如果有传入 category_id 字段，并且在数据库中有对应的类目
        if ($request->input('category_id') && $category = Category::find($request->input('category_id'))) {
            // 如果这是一个父类目
            if ($category->is_directory) {
                // 则筛选出该父类目下所有子类目的商品
                $builder->whereHas('category', function ($query) use ($category) {
                    // 这里的逻辑参考本章第一节
                    $query->where('path', 'like', $category->path.$category->id.'-%');
                });
            } else {
                // 如果这不是一个父类目，则直接筛选此类目下的商品
                $builder->where('category_id', $category->id);
            }
        }

        // order 参数用来控制商品的排序规则
        if ($order = $request->input('order', '')) {
            // 是否是以 _asc 或者 _desc 结尾
            if (preg_match('/^(.+)_(asc|desc)$/', $order, $m)) {
                // 如果字符串的开头是这 3 个字符串之一，说明是一个合法的排序值
                if (in_array($m[1], ['price', 'sold_count', 'rating'])) {
                    // 根据传入的排序值来构造排序参数
                    $builder->orderBy($m[1], $m[2]);
                }
            }
        }

        $products = $builder->paginate(16);
        return $this->response->paginator($products, new ProductTransformer());
    }

    // 详情
    public function show($id)
    {
        $product = Product::find($id);
        if(!$product->on_sale) {
            throw new \Exception('商品未上架');
        }
        return $this->response->item($product,new ProductTransformer());
    }

    // 收藏商品列表
    public function favorites()
    {
        $user = auth('api')->user();
        $res = $user->favoriteProducts()->paginate();
        return $this->response->paginator($res,new ProductTransformer());
    }
    
    // 关注
    public function favor($id)
    {
        $user = auth('api')->user();
        if($user->favoriteProducts()->find($id)) {
            return $this->response->array(responseJson(200,[],'success'));
        }
        $user->favoriteProducts()->attach(Product::find($id));
        return $this->response->array(responseJson(200,[],'success'));
    }
    
    // 取消关注
    public function disfavor($id)
    {
        $user = auth('api')->user();
        $user->favoriteProducts()->detach(Product::find($id));
        return [];
    }

}
